﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Configuration;
using MySql.Data.MySqlClient;
using System.Windows.Forms;

namespace DAL
{
    /// <summary>
    /// Chargé de récupérer/insérer/supprimer les données relatives aux catégories dans la db et de les renvoyer à la couche BU
    /// </summary>
    public static class CategoryDataProvider
    {
        // String contenant les données nécessaires pour ce connecter à la base de données
        // Déclaré dans app.Config dans la GUI
        public static string ConnectionString = ConfigurationManager.ConnectionStrings["bmg"].ConnectionString;

        /// <summary>
        /// Renvoie toutes les catégories contenues dans la base de données triées sur le nom
        /// </summary>
        /// <returns>DataTable categoryDT</returns>
        public static DataTable Fetch()
        {
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlCommand selectCommand = connection.CreateCommand();
                    selectCommand.CommandText = "SELECT categoryid, name, description ";
                    selectCommand.CommandText += "FROM category ";
                    selectCommand.CommandText += "ORDER BY name";

                    DataTable categoryDT = new DataTable("category");

                    MySqlDataAdapter adapter = new MySqlDataAdapter(selectCommand);
                    adapter.Fill(categoryDT);

                    return categoryDT;
                }
            }
            catch
            {

                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
            }
            return null;
        }

        /// <summary>
        /// Renvoie la catégorie correspondant à l'id passé en paramètre
        /// </summary>
        /// <param name="categoryID">int categoryID</param>
        /// <returns>DataTable categoryDT</returns>
        public static DataRow GetCategory(int categoryID)
        {
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlCommand selectCommand = connection.CreateCommand();
                    selectCommand.CommandText = "SELECT categoryid, name, description FROM category WHERE categoryid = @categoryid";
                    selectCommand.Parameters.AddWithValue("categoryid", categoryID);

                    DataTable categoryDT = new DataTable();

                    MySqlDataAdapter adapter = new MySqlDataAdapter(selectCommand);
                    adapter.Fill(categoryDT);

                    if (categoryDT.Rows.Count > 0)
                        return categoryDT.Rows[0];

                    return null;
                }
            }
            catch
            {

                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
            }
            return null;
        }

        /// <summary>
        /// Permet d'insérer une nouvelle catégorie dans la db
        /// </summary>
        /// <param name="categoryDT">DataTable categoryDT</param>
        public static void Insert(DataTable categoryDT)
        {
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM category", connection);

                    // Creation de la MysqlCommand pour exécuter la stored procedure
                    adapter.InsertCommand = new MySqlCommand("spInsertCategory", connection);
                    adapter.InsertCommand.CommandType = CommandType.StoredProcedure;

                    // Ajout des paramètre d'entrée
                    adapter.InsertCommand.Parameters.Add(new MySqlParameter("name", MySqlDbType.VarChar, 45, "name"));
                    adapter.InsertCommand.Parameters.Add(new MySqlParameter("description", MySqlDbType.VarChar, 120, "description"));

                    // Ajout d'un paramètre de sortie qui permet de récuperer l'id de la catégorie inserée
                    MySqlParameter parameter = adapter.InsertCommand.Parameters.Add(new MySqlParameter("categoryid", MySqlDbType.Int64, 0, "categoryid"));
                    parameter.Direction = ParameterDirection.Output;

                    adapter.Update(categoryDT);
                }
            }
            catch
            {

                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
            }
        }

        /// <summary>
        /// Fait la mise à jour des données contenues dans la table category à partir d'une DataTable reçue en paramètre
        /// </summary>
        /// <param name="categoryDT">DataTable categoryDT</param>
        public static void Update(DataTable categoryDT)
        {
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM category", connection);
                    MySqlCommandBuilder cmdBuilder = new MySqlCommandBuilder(adapter);

                    adapter.UpdateCommand = cmdBuilder.GetUpdateCommand();
                    adapter.Update(categoryDT);
                }
            }
            catch
            {

                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
            }
        }

        /// <summary>
        /// Permet de supprimer une catégorie de la base de données
        /// </summary>
        /// <param name="categoryDT">DataTable categoryDT</param>
        public static void Delete(DataTable categoryDT)
        {
            try
            {

                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM category", connection);
                    MySqlCommandBuilder cmdBuilder = new MySqlCommandBuilder(adapter);

                    adapter.DeleteCommand = cmdBuilder.GetDeleteCommand();
                    adapter.Update(categoryDT);
                }
            }
            catch
            {

                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
            }
        }
    }
}
